package com.situ.day12;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class ExceptionDemo {

	public static void main1(String[] args) {
		Student student = new Student(1, "张三", 21);
		String name = student.getName();
		student = null;
		// null.操作调用任何的属性或者方法：就会报空指针NullPointerException
		String name2 = student.getName();
	}

	public static void main2(String[] args) {
		// 运行时异常(RuntimeException)只有在程序运行的时候才可能出现异常
		// java.lang.ArithmeticException: / by zero
		int i = 0;
		System.out.println(20 / i);

		// 编译时异常，在写代码编译时就需要处理的异常，不处理会一直报错
		// Unhandled exception type InterruptedException
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main3(String[] args) {
		int num1 = 6;
		int num2 = 0;
		System.out.println("start");
		try {
			// 需要检测的代码(可能会抛出异常，也可能不会抛出异常)
			int result = num1 / num2;
		} catch (ArithmeticException e) {
			// 需要检测的代码(可能会抛出异常，也可能不会抛出异常)
			System.out.println("catch.main()");
			e.printStackTrace();
		} finally {
			// 一定会被执行的代码(不管异常抛不抛出都会执行，例如数据库释放连接)
			System.out.println("finally");
		}
		System.out.println("end");
	}

	public static void main4(String[] args) {
		// 对于编译时异常FileNotFoundException在fun函数里面没有处理，将这个异常抛出了，在调用方也有两种方式：
		// 1、我不想处理这个异常，继续throws抛出; 2、try-catch捕获这个异常
		try {
			fun();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	// 不处理异常，而是将异常抛出
	private static void fun() throws FileNotFoundException {
		FileInputStream fileInputStream = new FileInputStream("a.txt");
	}

	public static void main5(String[] args) {
		try {
			FileInputStream fileInputStream = new FileInputStream("a.txt");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

	}

	public static void main6(String[] args) {
		try {
			function();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
	}

	private static void function() throws IllegalAccessException {
		System.out.println("ExceptionDemo.function()");
		// 如果出现一些非法访问的情况，认为是一种严重的错误，我们主动抛出异常
		throw new IllegalAccessException("非法访问");
	}

	public static void main7(String[] args) {
		try {
			FileInputStream fileInputStream = new FileInputStream("a.txt");
			Thread.sleep(50);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (Exception e) {
			// Exception为所有异常的父类
			// 尽量不要用所有异常的父类来处理所有异常情况
			// 应该去捕获具体异常，除非是实在找不到这个问题了可以使用
			// 保证程序先不崩溃，后面可以再去找具体的错误
			e.printStackTrace();
		}

	}

//	public static void main(String[] args) {
//		Person person = new Student();
//		Teacher teacher = (Teacher) person;
//	}

	public static void main(String[] args) {
		MoneyManager moneyManager = new MoneyManager(1000.00, "1010101");
		moneyManager.deposite(500.00);
		try {
			moneyManager.withdraw(700.00);
		} catch (MyException e) {
			e.printStackTrace();
			double money = e.getMoney();
			System.out.println("还需要" + money);
		}
		try {
			moneyManager.withdraw(2000.00);
		} catch (MyException e) {
			e.printStackTrace();
			double money = e.getMoney();
			System.out.println("还需要" + money);

		}
		System.out.println("-------end--------");

	}
}
